﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;


namespace AttrapeMoi
{
    class Sprite
    {
        protected Texture2D texture;
        protected Vector2 position;
        protected Vector2 direction;
        protected float rotation;
        protected float speed;
        

        protected string nom;

        public string Nom
        {
            get { return nom; }
            set { nom = value; }
        }

        public Texture2D Texture
        {
            get { return texture; }
            set { texture = value; }
        }
        
        public Vector2 Position
        {
            get { return position; }
            set { position = value; }
        }

        public Vector2 Direction
        {
            get { return direction; }
            //set { direction = Vector2.Normalize(value); }
            set { direction = value; }
        }
        
        public float Speed
        {
            get { return speed; }
            set { speed = value; }
        }

        /// <summary>
        /// Retourne le rectangle de gestion des collisions
        /// </summary>
        public Rectangle CollisionRectangle
        {
            get
            {
                return new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);
            }
        }
        /// <summary>
        /// Initialise les variables du Sprite
        /// </summary>
        /// <param name="assetName">le nom de l'image a charger</param>
        public virtual void Initialize(string assetName)
        {
            position = Vector2.Zero;
            direction = Vector2.Zero;
            rotation = 0;
            speed = 0;
            nom = assetName;
        }

        /// <summary>
        /// Charge l'image voulue grâce au ContentManager donné
        /// </summary>
        /// <param name="content">Le ContentManager qui chargera l'image</param>
        /// <param name="largeur">La largeur de l'ecran</param>
        /// <param name="hauteur">La hauteur de l'ecran</param>
        public virtual void LoadContent(ContentManager content)
        {
            texture = content.Load<Texture2D>(nom);
        }

        /// <summary>
        /// Met à jour les variables du sprite
        /// </summary>
        /// <param name="gameTime">Le GameTime associé à la frame</param>
        public virtual void Update(GameTime gameTime, int longueur_x, int longueur_y)
        {
            position += direction * speed /* * (float)gameTime.ElapsedGameTime.TotalMilliseconds*/;
            
            if (position.X >= longueur_x)
                position.X = longueur_x - 1;
            else if (position.X < 0)
                position.X = 0;
            if (position.Y >= longueur_y)
                position.Y = longueur_y - 1;
            else if (position.Y < 0)
                position.Y = 0;
        }

        /// <summary>
        /// Permet de gérer les entrées du joueur
        /// </summary>
        /// <param name="keyboardState">L'état du clavier à tester</param>
        /// <param name="mouseState">L'état de la souris à tester</param>
        /// <param name="joueurNum">Le numéro du joueur qui doit être surveillé</param>
        public virtual void HandleInput(KeyboardState keyboardState, MouseState mouseState)
        {

        }

        /// <summary>
        /// Dessine le sprite en utilisant ses attributs et le spritebatch donné
        /// </summary>
        /// <param name="spriteBatch">Le spritebatch avec lequel dessiner</param>
        public virtual void Draw(SpriteBatch spriteBatch)
        {
            Vector2 positionReel = new Vector2(position.X * 21, position.Y * 21);
            spriteBatch.Draw(texture, positionReel, Color.White);
            //spriteBatch.Draw(texture, position, null, Color.White, rotation, origine, 1.0f, SpriteEffects.None, 0f);
        }

    }
}
